Файл.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 
(*~\Глагол\Отделы\Обмен~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ Файл;
(*============================================================================* 
 * НАЗНАЧЕНИЕ: работа с файлами                                               * 
 * ОБОЗНАЧЕНИЯ: место - местоположение файла на определенном накопителе       * 
 *              путь  - местоположение файла или относительный путь к файлу   * 
 *============================================================================*)
ИСПОЛЬЗУЕТ
  ОС,
  Цепь ИЗ "..\Иное\";
ПОСТ
                         (* наибольшие длины (с учетом конечного 0X): *)
  длПути-   =ОС.длПутиФ;    (* пути к файлу               *)
  длИмени-  =ОС.длИмениФ;   (* имени файла без типа файла *)
  длТипа-   =ОС.длТипаФ;    (* типа файла с начальной "." *)
  длПолного-=ОС.длПолногоФ; (* полного имени файла        *)
                         (* свойства файлов:*)
  сфОбычный-      =ОС.сфОбычный;
  сфТолькоЧтение- =ОС.сфТолькоЧтение;
  сфНевидимый-    =ОС.сфНевидимый;
  сфСистемный-    =ОС.сфСистемный;
  сфНазваниеДиска-=ОС.сфНазваниеДиска;
  сфКаталог-      =ОС.сфКаталог;
  сфАрхивный-     =ОС.сфАрхивный;
ВИД
  Поиск-=ОС.ПоискФ; (* системный набор для поиска файлов *)
  Время-=ОС.ВремяФ;

  ВПути-   =ЦЕПЬ[длПути];
  ВИмени-  =ЦЕПЬ[длИмени];
  ВТипа-   =ЦЕПЬ[длТипа];
  ВПолного-=ЦЕПЬ[длПолного];

(******************************************************************************)
ЗАДАЧА ИсправитьИмя(имя+:ЦЕПЬ);
(* Исправляет "/" на "\" и убирает повторы "\". *)
ПЕР
  ч,п,дл:ЦЕЛ;
  зн,зн1:ЗНАК;
УКАЗ
  дл:=ДЛИНА(имя);
  ч:=0;
  п:=0;
  зн1:=0X;
  ПОКА ч < дл ВЫП
    зн:=имя[ч];
    УВЕЛИЧИТЬ(ч);
    ЕСЛИ  зн = "/" ТО
      зн:="\"
    КОН;
    ЕСЛИ  (зн # "\") ИЛИ (зн1 # "\") ТО
      имя[п]:=зн;
      УВЕЛИЧИТЬ(п)
    КОН;
    зн1:=зн
  КОН;
  ЕСЛИ  п < дл ТО
    имя[п]:=0X
  КОН
КОН ИсправитьИмя;

(******************************************************************************)
ЗАДАЧА ИсправитьМесто(имя+:ЦЕПЬ);
(* Убирает по возможности ".." в местоположении файла. *)
ПЕР
  ч,п,послпалка,начпоз,дл:ЦЕЛ;
  зв,зн:ЗНАК;
  точек:ЦЕЛ;

  ЗАДАЧА ЧП();  (* Читаем и Пишем (вперёд) *)
  УКАЗ
    ЕСЛИ  ч < дл ТО
      зв:=имя[ч];
      имя[п]:=зв;
      УВЕЛИЧИТЬ(ч);
      УВЕЛИЧИТЬ(п)
    ИНАЧЕ
      зв:=0X
    КОН
  КОН ЧП;

  ЗАДАЧА Чвперёд();  (* Читаем вперёд *)
  УКАЗ
    ЕСЛИ  ч < дл ТО
      зв:=имя[ч];
      УВЕЛИЧИТЬ(ч)
    ИНАЧЕ
      зв:=0X
    КОН
  КОН Чвперёд;

  ЗАДАЧА Чназад();  (* Читаем назад *)
  УКАЗ
    ЕСЛИ  п > начпоз ТО
      УМЕНЬШИТЬ(п);
      зн:=имя[п]
    ИНАЧЕ
      зн:=0X
    КОН
  КОН Чназад;

УКАЗ
  ИсправитьИмя(имя);
  дл:=ДЛИНА(имя);
  (* не рассматриваем накопитель *)
  начпоз:=Цепь.ПозицияЗнака(":",имя,0)+1;
  ч:=начпоз;
  п:=начпоз;
  ЧП();
  ПОКА ч < дл ВЫП
    ЕСЛИ  зв = "." ТО
      (* считаем точки *)
      точек:=0;
      ПОКА зв = "." ВЫП
        УВЕЛИЧИТЬ(точек);
        ЧП()
      КОН;
      (* откатываем палки *)
      послпалка:=п;
      Чназад();
      ПОКА (п > начпоз) И (точек > 0) ВЫП
        Чназад();
        ЕСЛИ  зн = "\" ТО
          послпалка:=п+1;
          УМЕНЬШИТЬ(точек)
        КОН
      КОН;
      п:=послпалка;
      (* пропуск лишних имён *)
      ПОКА (ч < дл) И (зв # "\") ВЫП
        Чвперёд()
      КОН
    АЕСЛИ  зв = "\" ТО
      ЧП()
    ИНАЧЕ
      (* пропуск имён *)
      ПОКА (ч < дл) И (зв # "\") ВЫП
        ЧП()
      КОН
    КОН
  КОН;
  (* отсекаем лишнее *)
  ЕСЛИ  п < дл ТО
    имя[п]:=0X
  КОН
КОН ИсправитьМесто;

(******************************************************************************)
ЗАДАЧА НайтиМесто-(отместа-,путь-,место+:ЦЕПЬ);
(* Находит местоположение файла <место>, зная путь <путь> из точки <отместа>. *)
УКАЗ
  ЕСЛИ  Цепь.ПозицияЗнака(":",путь,0) # -1 ТО    (* путь - местоположение *)
    СПИСАТЬ(путь,место)
  ИНАЧЕ
    СПИСАТЬ(отместа,место);
    ЕСЛИ  место # "" ТО
      ЕСЛИ  место[ДЛИНА(место)-1] # "\" ТО
        Цепь.ДобавитьЗнак(место,"\")
      КОН;
      ЕСЛИ  (путь # "") И ((путь[0]="\") ИЛИ (путь[0]="/")) ТО
        (* путь - корневой *)
        (* оставляем у старого места только накопитель *)
        место[Цепь.ПозицияЗнака(":",место,0)+1]:=0X
      КОН
    КОН;
    Цепь.Добавить(место,путь)
  КОН;
  ИсправитьМесто(место)
КОН НайтиМесто;

(******************************************************************************)
ЗАДАЧА РазобратьИмя-(пимя-,путь+,имя+,тип+:ЦЕПЬ);
(* Переписывает из цепочки с полным именем файла <пимя> в <путь> путь к файлу,
 * в <имя> имя файла без его типа, в <тип> тип файла. *)
ПЕР
  пам:ВПолного;
  поз:ЦЕЛ;
  естьпуть,естьтип:КЛЮЧ;

  (* Возвращает ВКЛ, если текущая "." определяет путь, а не тип файла. *)
  ЗАДАЧА ТочечныйПуть(поз:ЦЕЛ):КЛЮЧ;
  УКАЗ
    УМЕНЬШИТЬ(поз);
    ЕСЛИ  (поз < 0)
      ИЛИ (пам[поз] = "\")
      ИЛИ (пам[поз] = ":")
      ИЛИ (пам[поз] = ".")
    ТО
      ВОЗВРАТ ВКЛ
    КОН;
    ВОЗВРАТ ОТКЛ
  КОН ТочечныйПуть;

УКАЗ
  СПИСАТЬ(пимя,пам);
  ИсправитьИмя(пам);
  путь[0]:=0X;
  имя[0]:=0X;
  тип[0]:=0X;
  естьпуть:=ОТКЛ;
  естьтип:=ОТКЛ;
  поз:=ДЛИНА(пам);
  ПОКА поз > 0 ВЫП
    УМЕНЬШИТЬ(поз);
    ЕСЛИ  пам[поз] = "." ТО
      ЕСЛИ  НЕ естьпуть И (пам[поз+1] = 0X) ТО
        естьпуть:=ТочечныйПуть(поз)
      КОН;
      ЕСЛИ  НЕ естьпуть И НЕ естьтип ТО
        естьтип:=ВКЛ;
        Цепь.Часть(пам,тип,поз,длТипа-1);
        пам[поз]:=0X
      КОН
    АЕСЛИ  (пам[поз] = "\") И НЕ естьпуть ТО
      естьпуть:=ВКЛ;
      Цепь.Часть(пам,имя,поз+1,длИмени-1);
      пам[поз+1]:=0X
    КОН
  КОН;
  ЕСЛИ  естьпуть ТО
    Цепь.Часть(пам,путь,0,длПути-1)
  ИНАЧЕ
    Цепь.Часть(пам,имя,0,длИмени-1)
  КОН
КОН РазобратьИмя;

(******************************************************************************)
ЗАДАЧА СобратьИмя-(пимя+,путь-,имя-,тип-:ЦЕПЬ);
(* Собирает полное имя файла <пимя> из пути к файлу <путь>,
 * имени файла без его типа <имя> и типа файла <тип>. *)
УКАЗ
  СПИСАТЬ(путь,пимя);
  ЕСЛИ  пимя # "" ТО
    ИсправитьИмя(пимя);
    ЕСЛИ  пимя[ДЛИНА(пимя)-1] # "\" ТО
      Цепь.ДобавитьЗнак(пимя,"\")
    КОН
  КОН;
  Цепь.Добавить(пимя,имя);
  ЕСЛИ  тип # "" ТО
    ЕСЛИ  тип[0] # "." ТО
      Цепь.ДобавитьЗнак(пимя,".")
    КОН;
    Цепь.Добавить(пимя,тип)
  КОН
КОН СобратьИмя;

(******************************************************************************)
ЗАДАЧА ПутьИзПолного-(пимя-,путь+:ЦЕПЬ);
(* Переписывает из цепочки с полным именем файла <пимя> в цепочку <путь>
 * путь к файлу (включая УКАЗание диска и "\" перед именем файла). *)
ПЕР
  пам:ВПолного;
УКАЗ
  РазобратьИмя(пимя,путь,пам,пам)
КОН ПутьИзПолного;

(******************************************************************************)
ЗАДАЧА ИмяИзПолного-(пимя-,имя+:ЦЕПЬ);
(* Переписывает из цепочки с полным именем файла <пимя> в цепочку <имя>
 * имя файла. *)
ПЕР
  пам:ВПолного;
УКАЗ
  РазобратьИмя(пимя,пам,имя,пам)
КОН ИмяИзПолного;

(******************************************************************************)
ЗАДАЧА ИмяТипИзПолного-(пимя-,имятип+:ЦЕПЬ);
(* Переписывает из цепочки с полным именем файла <пимя> в цепочку <имятип>
 * имя и тип (расширение) файла. *)
ПЕР
  пам:ВПолного;
  имя:ВИмени;
  тип:ВТипа;
УКАЗ
  РазобратьИмя(пимя,пам,имя,тип);
  СПИСАТЬ(имя,имятип);
  Цепь.Добавить(имятип,тип)
КОН ИмяТипИзПолного;

(******************************************************************************)
ЗАДАЧА ТипИзПолного-(пимя-,тип+:ЦЕПЬ);
(* Переписывает из цепочки с полным именем файла <пимя> в цепочку <тип>
 * тип (расширение) файла. *)
ПЕР
  пам:ВПолного;
УКАЗ
  РазобратьИмя(пимя,пам,пам,тип)
КОН ТипИзПолного;

(******************************************************************************)
ЗАДАЧА ИзменитьТип-(пимя+,тип-:ЦЕПЬ);
(* Изменяет тип (расширение) в полном имени файла <пимя> на <тип>. *)
ПЕР
  путь:ВПути;
  имя:ВИмени;
  старыйтип:ВТипа;
УКАЗ
  РазобратьИмя(пимя,путь,имя,старыйтип);
  СобратьИмя(пимя,путь,имя,тип)
КОН ИзменитьТип;

(******************************************************************************)
ЗАДАЧА Существует-(имя-:ЦЕПЬ):КЛЮЧ;
(* Возвращает ВКЛ, если существует файл с именем <имя>. *)
ПЕР
  поиск:Поиск;
УКАЗ
  ЕСЛИ  ОС.ПервыйПоискФ(имя,поиск) ТО
    ОС.ОкончитьПоискФ(поиск);
    ВОЗВРАТ ВКЛ
  КОН;
  ВОЗВРАТ ОТКЛ
КОН Существует;

(******************************************************************************)
ЗАДАЧА ВремяИзменения-(имя-:ЦЕПЬ; время+:Время);
(* Возвращает <время> изменения файла <имя> или -1. *)
ПЕР
  поиск:Поиск;
УКАЗ
  ЕСЛИ НЕ ОС.ПервыйПоискФ(имя,поиск) ТО
    время:=-1;
    ВОЗВРАТ
  КОН;
  время:=поиск.времяПослЗаписи;
  ОС.ОкончитьПоискФ(поиск)
КОН ВремяИзменения;

(******************************************************************************)
ЗАДАЧА Размер-(имя-:ЦЕПЬ):ЦЕЛ;
(* Возвращает размер файла <имя> или -1. *)
ПЕР
  поиск:Поиск;
  размер:ЦЕЛ;
УКАЗ
  ЕСЛИ  НЕ ОС.ПервыйПоискФ(имя,поиск) ТО
    ВОЗВРАТ -1
  КОН;
  размер:=поиск.размерМладш;
  ОС.ОкончитьПоискФ(поиск);
  ВОЗВРАТ размер
КОН Размер;

(******************************************************************************)
ЗАДАЧА Найти-(имя-,тип-,пути-,пимя+:ЦЕПЬ):КЛЮЧ;
(* Ищет файл с именем <имя> и типом <тип> в списке путей нахождения файла
 * <пути>. Пути нахождения файла перечислены в цепочке <пути> через точку
 * с запятой. Если файл найден, то в цепочку <пимя> задача записывает полный
 * путь к этому файлу и возвращает ВКЛ, в противном случае возвращает ОТКЛ. *)
ПЕР
  путь:ВПути;
  начп,конп,длпутей:ЦЕЛ;
УКАЗ
  длпутей:=ДЛИНА(пути);
  начп:=0;
  ПОВТОРЯТЬ
    конп:=Цепь.ПозицияЗнака(";",пути,начп);
    ЕСЛИ  конп < 0 ТО
      конп:=длпутей
    КОН;
    Цепь.Часть(пути,путь,начп,конп-начп);
    СобратьИмя(пимя,путь,имя,тип);
    ЕСЛИ  Существует(пимя) ТО
      ВОЗВРАТ ВКЛ
    КОН;
    начп:=конп+1
  ДО начп >= длпутей;
  ВОЗВРАТ ОТКЛ
КОН Найти;

КОН Файл.

 
 


Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com

 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы